package example;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 *
 网元设备随着版本演进发布两种性质的版本：

 正式版本：格式固定为两端，即 release.xx ，xx 固定为两位数字，表示大版本号，如: release.23 ，release.01
 补丁版本：格式固定为三段，即 patch.xx.yy ，xx 和 yy 都是固定两位数字，xx 表示大版本号，yy 表示补丁号，代表正式版本 release.xx 的补丁版本。如：patch.23.02 是正式版本 release.23 的补丁

 现给出一批版本 versions ，请将其中的正式版本，按如下排序规则返回：

 首先，按补丁个数降序
 其次，按大版本号升序

 输入：
 1 <= versions.length <= 1000 ，元素各有不同
 输入保证：补丁版本一定有其所属的正式版本

 输出：
 排序后的正式版本列表
 */

public class Exam0022 {

    List<String> arrangeVersion(List<String> versions) {

        Map<String, Integer> versionPatchCount = new HashMap<>();
        for (String version : versions) {
            if (version.contains("release")) {
                String[] split = version.split("\\.");
                versionPatchCount.putIfAbsent(split[1], 0);
            }
            if (version.contains("patch")) {
                String[] split = version.split("\\.");
                String key = split[1];
                if (versionPatchCount.get(key) == null) {
                    versionPatchCount.put(key, 1);
                }else {
                    versionPatchCount.put(key, versionPatchCount.getOrDefault(key, 0) + 1);
                }
            }
        }

        return sortMap(versionPatchCount);
    }

    private static List<String> sortMap(Map<String, Integer> versionPatchCount) {
        List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(versionPatchCount.entrySet());
        infoIds.sort(new Comparator<>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                if (Objects.equals(o1.getValue(), o2.getValue())) {
                    return Integer.parseInt(o1.getKey()) - Integer.parseInt(o2.getKey());
                }
                return o2.getValue() - o1.getValue();
            }
        });
        List<String> result = new ArrayList<>();
        for (Map.Entry<String, Integer> infoId : infoIds) {
            String id = infoId.getKey();
            result.add("release." + id);
        }
        return result;
    }

    public static void main(String[] args) {
        Exam0022 exam002 = new Exam0022();
        List<String> versions = Arrays.asList(
                "release.21",
                "release.23",
                "patch.21.01",
                "patch.23.02",
                "patch.24.05",
                "release.24",
                "release.09",
                "patch.21.11",
                "patch.23.12",
                "patch.24.01",
                "patch.24.08"
        );
        List<String> strings = exam002.arrangeVersion(versions);
        System.out.println(Arrays.toString(strings.toArray()));
    }
}
